#ifndef MICROSCHEME_H
#define MICROSCHEME_H

#include <QObject>
#include <QVector>

#include "baseelement.h"
#include "signalgenerator.h"
#include "signalcontainer.h"
#include "xmlhelper.h"

//Класс, кординирующий работу всех компонентов схемы
class MicroScheme : public QObject
{
    Q_OBJECT

public:
    //Создать схему
    MicroScheme();

    //Деструктор
    ~MicroScheme();

    // =========== Fields =========

    //Элементы схемы
    QVector<BaseElement*> elements;

    //Генераторы
    QVector<ISignalGenerator*> generators;

    //Наблюдаемые элементы
    QVector<SignalContainer*> watches;

    //Название схемы
    QString title;

    //Описание
    QString description;

    //Автор
    QString author;

    //Размер холста
    QSize canvasSize;

    //Путь к файлу
    QString schemeFile;

    //Количество тактов
    uint tactCount;

    //Количество секунд в такте
    uint ticPerTact;

    //Сигнал по-умолчанию для висящих в воздухе контактов
    signed char initialSignal;

    // =========== Methods =========

    //Проверить имя элемента на уникальность
    bool checkElementName(const BaseElement& element,const QString& newname);

    //Поиск элемента по имени
    BaseElement* searchElementByName(const QString& name);

    //Подобрать незанятое имя для нового элемента
    QString newElementName(const BaseElement& element);

    //Подобрать незанятое имя для нового элемента
    QString newElementName(const QString& elementtype);

    //Привести схему в исходное состояние
    void refresh();

    //Добавить элемент в схему
    void appendObject(BaseElement* element);

    //Удалить объект из схемы
    void disposeObject(BaseElement* element);

    //Запуск выполнения
    void run();

    //Загрузить схему
    static MicroScheme* load(QString config);

    static MicroScheme* loadFromNode(QDomDocument &domDoc);

    //Сохранить схему
    static void save(MicroScheme* scheme, QString config);

    // Сохранить в узел xml-документаa
    static QDomElement saveToNode(MicroScheme* scheme, QDomDocument &domDoc);
};

#endif // MICROSCHEME_H
